C/C++ GPIO development¶
Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.
This document describes the recommended method for accessing GPIO using C/C++ on the Quectel Pi M2. The current development board has been verified to support libgpiod v1.6.3, and the libgpiod approach is recommended by default.
Environment Setup¶
sudo apt update
sudo apt install -y build-essential gpiod libgpiod-dev
gpiodetect --version
gpiodetect
Item |
Description |
|---|---|
Recommended Library |
libgpiod |
Compilation Option |
|
Main Controller |
Currently verified as |
Input Example¶
#include <gpiod.h>
#include <stdio.h>
int main(void)
{
struct gpiod_chip *chip;
struct gpiod_line_settings *settings;
struct gpiod_line_config *line_cfg;
struct gpiod_request_config *req_cfg;
struct gpiod_line_request *request;
unsigned int offset = 36;
int value;
chip = gpiod_chip_open("/dev/gpiochip0");
if (!chip) {
perror("gpiod_chip_open");
return 1;
}
settings = gpiod_line_settings_new();
gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT);
line_cfg = gpiod_line_config_new();
gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings);
req_cfg = gpiod_request_config_new();
gpiod_request_config_set_consumer(req_cfg, "m1-gpio-input");
request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
if (!request) {
perror("gpiod_chip_request_lines");
return 1;
}
value = gpiod_line_request_get_value(request, offset);
printf("value=%d\n", value);
gpiod_line_request_release(request);
gpiod_line_config_free(line_cfg);
gpiod_line_settings_free(settings);
gpiod_request_config_free(req_cfg);
gpiod_chip_close(chip);
return 0;
}
gcc -Wall -o gpio_input gpio_input.c -lgpiod
sudo ./gpio_input
Output Example¶
#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
struct gpiod_chip *chip;
struct gpiod_line_settings *settings;
struct gpiod_line_config *line_cfg;
struct gpiod_request_config *req_cfg;
struct gpiod_line_request *request;
unsigned int offset = 36;
chip = gpiod_chip_open("/dev/gpiochip0");
if (!chip) {
perror("gpiod_chip_open");
return 1;
}
settings = gpiod_line_settings_new();
gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT);
gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_ACTIVE);
line_cfg = gpiod_line_config_new();
gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings);
req_cfg = gpiod_request_config_new();
gpiod_request_config_set_consumer(req_cfg, "m1-gpio-output");
request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
if (!request) {
perror("gpiod_chip_request_lines");
return 1;
}
sleep(1);
gpiod_line_request_set_value(request, offset, GPIOD_LINE_VALUE_INACTIVE);
gpiod_line_request_release(request);
gpiod_line_config_free(line_cfg);
gpiod_line_settings_free(settings);
gpiod_request_config_free(req_cfg);
gpiod_chip_close(chip);
return 0;
}
gcc -Wall -o gpio_output gpio_output.c -lgpiod
sudo ./gpio_output
Notes¶
The actual line offset must be confirmed against the development board’s pin definitions.
If execution fails, first use
gpioinfo /dev/gpiochip0to check whether the line is in use.If the compiler reports that
gpiod.hcannot be found, confirm thatlibgpiod-devis installed.